// using System.Text;
// using Microsoft.CodeAnalysis;
// using Microsoft.CodeAnalysis.Text;
//
// // ReSharper disable once CheckNamespace
//
// /// <summary>
// ///
// /// </summary>
// [Generator]
// public class Repositories : ISourceGenerator
// {
//     /// <summary>
//     ///
//     /// </summary>
//     /// <param name="context"></param>
//     /// <exception cref="NotImplementedException"></exception>
//     public void Initialize(GeneratorInitializationContext context)
//     {
//         // context.RegisterForSyntaxNotifications(() => new AggregateRootSyntaxReceiver());
//     }
//
//     private static HashSet<string> LoadAllTypes(INamespaceSymbol namespaceSymbol)
//     {
//         var list = new HashSet<string>();
//         foreach (var namespaceMember in namespaceSymbol
//                      .GetNamespaceMembers())
//         {
//             var tmp = LoadAllTypes(namespaceMember);
//             foreach (var item in tmp)
//             {
//                 list.Add(item);
//             }
//         }
//
//         foreach (var member in namespaceSymbol.GetMembers())
//         {
//             list.Add(member.ToDisplayString());
//         }
//
//         return list;
//     }
//
//     /// <summary>
//     ///
//     /// </summary>
//     /// <param name="context"></param>
//     /// <exception cref="NotImplementedException"></exception>
//     public void Execute(GeneratorExecutionContext context)
//     {
//         var domainAssemblyName = context.Compilation
//             .AssemblyName?.Replace("Infrastructure", "Domain");
//         var log = new StringBuilder();
//         log.AppendLine($"// <auto-generated time='{DateTimeOffset.Now:yyyy-MM-dd HH:mm:ss}' />");
//         if (string.IsNullOrEmpty(domainAssemblyName))
//         {
//             log.Append("// warning: ").AppendLine("DomainAssemblyName is empty");
//         }
//         else
//         {
//             var domainMetadataReference = context.Compilation.References
//                 .FirstOrDefault(x => !string.IsNullOrEmpty(x.Display)
//                                      && x.Display.Contains(domainAssemblyName));
//             if (domainMetadataReference == null)
//             {
//                 log.Append("// warning: ").AppendLine("DomainAssembly is missing");
//             }
//             else
//             {
//                 var assemblyOrModuleSymbol =
//                     context.Compilation.GetAssemblyOrModuleSymbol(domainMetadataReference)
//                         as IAssemblySymbol;
//
//                 var list = new HashSet<string>();
//                 if (assemblyOrModuleSymbol != null)
//                 {
//                     list = LoadAllTypes(assemblyOrModuleSymbol.GlobalNamespace);
//                 }
//
//                 foreach (var entityFullName in list)
//                 {
//                     var aggregateRootInfo =
//                         context.GetAggregateRootInfo(entityFullName);
//                     if (!aggregateRootInfo.IsAggregateRoot)
//                     {
//                         log.Append("// info: ignore class -> ").AppendLine(entityFullName);
//                         continue;
//                     }
//
//                     log.Append("// info: handle class -> ").AppendLine(entityFullName);
//
//                     var typeInfo = aggregateRootInfo.Type.GetTypeInfo();
//                     var namespaceName = typeInfo.Namespace.Replace("Domain", "Infrastructure");
//                     var script = $$"""
//                                    // <auto-generated time='{{DateTimeOffset.Now:yyyy-MM-dd HH:mm:ss}}' />
//                                    using MicroserviceFramework.Ef;
//                                    using MicroserviceFramework.Ef.Repositories;
//                                    using {{typeInfo.Namespace}};
//                                    using E = {{entityFullName}};
//
//                                    namespace {{namespaceName}};
//
//                                    public partial class {{typeInfo.TypeName}}Repository
//                                        : EfRepository<E, {{aggregateRootInfo.Key}}>, I{{typeInfo.TypeName}}Repository
//                                    {
//                                        public {{typeInfo.TypeName}}Repository(DbContextFactory context) : base(context)
//                                        {
//                                            UseQuerySplittingBehavior = true;
//                                        }
//                                    }
//                                    """;
//
//                     context.AddSource($"{typeInfo.Namespace}.{typeInfo.TypeName}.g.cs",
//                         SourceText.From(script, Encoding.UTF8));
//                 }
//             }
//         }
//
//         context.AddSource("Log.2.g.cs", SourceText.From(log.ToString(), Encoding.UTF8));
//     }
// }
